
import * as bfun from '../../core/fbyte.js';

/**
 * 标准包协议2.0
 * 适用于间接路由
 * 概念程序,还未测试
 */
export default class PackV2 {
    constructor() {
        //this.总长度=0; //pack[0，4)
        //this.校验码=0;//pack[4，8)
        //data=pack[8,指令块长度)
        //this.指令块长度=0;// data[0，2)
        this.指令 = 0;// data[2，4)
        this.路径 = null;
        this.流转方式 = 0;//data[4,6)
        this.指令参数 = null;// data[6，指令块长度)
        //pack[指令块长度，结尾)
        this.字节数据 = null;// data[指令块长度)
    }
    set事件(指令) {
        this.指令 = 指令;
        if (指令 <=0)
            this.流转方式 = TSM.T未知;
        else if (指令 > 0 && 指令 < 10000)
            this.流转方式 = TSM.T点对系统;
        else if (指令 >= 10000 && 指令 < 20000)
            this.流转方式 = TSM.T点对点;
        else if (指令 >= 20000 && 指令 < 30000)
            this.流转方式 = TSM.T点对群;
        //大于30000 的流转方式手工指定
    }
}
/**
 * 解析前端聊天数据包
 * 数据部长度4|校验码4 [指令和参数长度4|指令4|流转方式1|指令参数|字节数据]
 * @param {Uint8Array} packbytes  ArrayBuffer 类型
 * @returns {PackV1}
 */
PackV1.deserial = function (packbytes) {
    var self = new PackV1();
    let 数据部长度 = bfun.byte4ToInt(packbytes.subarray(0, 4));
    let 校验码 = bfun.byte4ToInt(packbytes.subarray(4, 8));
    let data = packbytes.subarray(8);
    let jym = bfun.getHash(data);
    if (jym != 校验码) return null;

    let 指令和参数长度 = bfun.byte4ToInt(data.subarray(0, 4));
    self.指令 = bfun.byte4ToInt(data.subarray(4, 8));
    self.流转方式 = data.subarray(8, 9)[0];
    let b文本参数 = data.subarray(9, 指令和参数长度);
    self.指令参数 = bfun.Utf8ArrayToStr(b文本参数);

    if (数据部长度 > 指令和参数长度) {
        self.字节数据 = data.subarray(指令和参数长度);//取出 指令参数长度 之后的数据
    }
    return self;
};
/**
 * 数据部长度4|校验码4 [指令和参数长度4|指令4|流转方式1|指令参数|字节数据]
 * @param {PackV1} pack short 
 * @returns {Uint8Array} 
 */
PackV1.serial = function (pack) {


    let b文本参数 = bfun.strToUtf8Array(pack.指令参数);
    let 字节数据长度 = pack.字节数据 ? pack.字节数据.length : 0;
    let 指令和参数长度 = 9 + b文本参数.length;
    let 数据部长度 = 字节数据长度 + 指令和参数长度;
    var buffer = new ArrayBuffer(数据部长度);
    /// var data1 = new DataView(buffer);
    var data = new Uint8Array(buffer);
	//console.log("指令和参数长度",b文本参数,字节数据长度,数据部长度,指令和参数长度)
    data.set(bfun.intToByte4(指令和参数长度))
    data.set(bfun.intToByte4(pack.指令), 4)
    data.set([pack.流转方式], 8)
    data.set(b文本参数, 9); //指令参数 5
    if (字节数据长度 > 0) {
        data.set(pack.字节数据, 指令和参数长度);//数据          
    }

    let 校验码 = bfun.getHash(data);
    let uint8data2 = new Uint8Array(数据部长度 + 8);
    uint8data2.set(bfun.intToByte4(数据部长度));//指令校验码  4    
    uint8data2.set(bfun.intToByte4(校验码), 4);//指令校验码  4    
    uint8data2.set(data, 8);//指令校验码  4    
    // console.log("pack",pack.数据,data,uint8data2)
    return uint8data2;
};




// var pk1 = new PackV1();
// pk1.指令 = CMT.P_下载好友列表;
// pk1.流转方式 = TSM.T点对群;
// pk1.指令参数 = { dff: "33", 接收方: ["点对","爸爸","打电话"] ,"点对":null}
// let dp1 = { dff2: "33", 方法2: "33爸爸" }
// pk1.字节数据 = bfun.json2Bytes(dp1)
// console.log(pk1)
// let pp = PackV1.serial(pk1)
// console.log(pp)
// let pp2 = PackV1.deserial(pp)
// console.log(pp2, bfun.bytes2Json(pp2.字节数据))